import { ByteArray } from "./ByteArray.ts";

/**
 * DataReader类实现了IDataReader接口，用于从文件中读取数据。
 * @author tongxin
 * @date 2024/4/17 22:46
 */
export class PEFileReader implements IPEFileReader {
  // 定义要读取的文件
  private file: File;
  // 定义文件读取的起始偏移量
  private offset: number = 0;

  /**
   * 构造函数，初始化文件和偏移量。
   * @param file 要读取的文件对象。
   * @param offset 可选参数，指定文件读取的起始偏移量。
   */
  constructor(file: File, offset?: number) {
    this.file = file;
    if (offset != null) {
      this.offset = offset;
    }
  }

  /**
   * 从文件中读取指定长度的数据。
   * @param length 要读取的数据长度。
   * @param offset 可选参数，指定本次读取操作的起始偏移量。
   * @returns 返回一个Promise，解析为包含读取数据的DataView对象。
   */
  async read(
    length: number,
    offset?: number
  ): Promise<IByteArray> {
    return this.readBuffer(length, offset).then((buffer) => {
      return new ByteArray(buffer);
    });
  }

  /**
   * 设置文件读取的起始偏移量。
   * @param offset 新的起始偏移量。
   */
  setOffset(offset: number): void {
    this.offset = offset;
  }

  /**
   * 获取当前文件读取的起始偏移量。
   * @returns 当前的起始偏移量。
   */
  getOffset(): number {
    return this.offset;
  }

  readBuffer(length: number, offset?: number): Promise<ArrayBuffer> {
    if (offset != null) {
      this.offset = offset;
    }
    return this.file.slice(this.offset, this.offset + length).arrayBuffer().then(result => {
      this.offset += length;
      return result;
    });
  }
}
